/**
 * Copyright (c) 2024,  科泰集团教研团队
 * 版权所有，请勿侵权
 */
package aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;


/**
 * @author 科泰集团教研团队
 * @version 1.0.0
 * @packageName aop
 * @fileName TransactionAspect.java
 * @createTime 2024/9/30 20:48
 * @lastModify 2024/9/30 20:48
 */
@Aspect // 表示这是一个切面类
@Component // 结合扫描包，产生bean对象注入到IoC容器中
public class TransactionAspect {
    private static final Logger log = LoggerFactory.getLogger(TransactionAspect.class);
    @Pointcut("execution(* service..*.*(..))")
    public void pt(){}

    @Before(value="pt()")
    public void before(JoinPoint jp) {
        log.info("【TransactionAspect前置增强】模拟打开数据库连接并开启事务...");
        log.info("SqlSession sqlSession = MyBatisUtil.createSqlSession(false);");
    }
    @AfterReturning(value="pt()", returning="result")
    public void afterReturning(JoinPoint jp, Object result) {
        log.info("【TransactionAspect后置增强】模拟正常完成业务提交事务...");
        log.info("session.commit();");
    }
    @AfterThrowing(value="pt()", throwing = "e")
    public void afterThrowing(JoinPoint jp, Throwable e) {
        log.info("【TransactionAspect异常抛出增强】模拟业务异常回滚事务，异常信息为："
                + e.getMessage());
        log.info("session.rollback();");
    }
    @After(value="pt()")
    public void after(JoinPoint jp) {
        log.info("【TransactionAspect最终增强】模拟业务完成释放资源...");
        log.info("MyBatisUtil.closeSqlSession(sqlSession);");
    }
}
